#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Pins.h"
void MyI2C_W_SCL(uint8_t BitValue)
	{
		GPIO_WriteBit(GPIOB,SCL,(BitAction)BitValue);
		Delay_us(10);
	}
	
void MyI2C_W_SDA(uint8_t BitValue)
	{
		GPIO_WriteBit(GPIOB,SDA,(BitAction)BitValue);
		Delay_us(10);
	}	
	
uint8_t MyI2C_R_SDA(void)
	{
		uint8_t BitValue;
		BitValue = GPIO_ReadInputDataBit(GPIOB,SDA);
		Delay_us(10);
		return BitValue;
	}		

void MyI2C_Init(void)
	{
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
		GPIO_InitTypeDef GPIO_InitStructure;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
		GPIO_InitStructure.GPIO_Pin = SCL | SDA;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB,&GPIO_InitStructure);
		GPIO_SetBits(GPIOB,SCL | SDA);
	}

void MyI2C_Start(void)
	{
		MyI2C_W_SDA(1);
		MyI2C_W_SCL(1);
		MyI2C_W_SDA(0);
		MyI2C_W_SCL(0);//先释放SDA再释放SCL，先拉低SDA再拉低SCL
	}

void MyI2C_Stop(void)
	{
		MyI2C_W_SDA(0);
		MyI2C_W_SCL(1);
		MyI2C_W_SDA(1);
	}	
	
void MyI2C_SendByte(uint8_t Byte)
	{
		uint8_t i;
		for(i = 0;i < 8;i++)
		{
			MyI2C_W_SDA(Byte & (0x80 >> i));
			MyI2C_W_SCL(1);
			MyI2C_W_SCL(0);
		}
		/*MyI2C_W_SDA(Byte & 0x80);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);//最高位：Byte 与 0X80即0b1000 0000进行按位与，即可取出最高位
		
		MyI2C_W_SDA(Byte & 0x40);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);//次高位
		
		MyI2C_W_SDA(Byte & 0x20);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
		
		MyI2C_W_SDA(Byte & 0x10);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
		
		MyI2C_W_SDA(Byte & 0x08);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
		
		MyI2C_W_SDA(Byte & 0x04);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
		
		MyI2C_W_SDA(Byte & 0x02);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);
		
		MyI2C_W_SDA(Byte & 0x01);
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);*/
	}	
	
uint8_t MyI2C_ReceiveByte(void)	
	{
		uint8_t i,Byte = 0x00;
		MyI2C_W_SDA(1);//主机在接收之前需要释放SDA
		for(i = 0;i < 8;i++)
		{
			MyI2C_W_SCL(1);
		  if(MyI2C_R_SDA ()) {Byte |= (0x80 >> i);}
			MyI2C_W_SCL(0);
		}
		return Byte;
	}
void MyI2C_SendAck(uint8_t AckBit)
	{
		
			MyI2C_W_SDA(AckBit);
			MyI2C_W_SCL(1);
			MyI2C_W_SCL(0);
	}	
	
uint8_t MyI2C_ReceiveAck(void)	
	{
		uint8_t AckBit;
		MyI2C_W_SDA(1);//主机在接收之前需要释放SDA
		MyI2C_W_SCL(1);
		AckBit = MyI2C_R_SDA();
		MyI2C_W_SCL(0);
		return AckBit;
	}	
